package SolucaoPeterson;

/*
 ******************************************************************************
 *
 * Arquivo: RegiaoCritica.java 
 * Pacote: SolucaoPeterson
 *
 * Author : Igor Arduini, Rafael Vieira, Thayná Oliveira, Vandré Leal
 *
 * Copyright 2013 Todos os direitos são reservados, a reprodução total ou em
 * parte é proibida sem a autorização por escrito do proprietário do copyright.
 *
 ******************************************************************************
 */
public abstract class RegiaoCritica {

    static int N = 2; // inteiro responsável pela definição do número de processos.
    static int turn; // inteiro responsável por delimitação de turno ("de quem é a vez?")
    static boolean[] interested = new boolean[N]; // vetor booleano que marca interesse.

    /*
    public RegiaoCritica() {
        for (int i = 0; i < N; i++) {
            interested[i] = false;
        }
    }
    */

    @SuppressWarnings("empty-statement")
    public void enter_region(int process) { /* processo é 0 ou 1 */
        int other = 1 - process; /* número de outro processo; o oposto do processo*/

        try {
            /* mostra que você está interessado */
            RegiaoCritica.interested[process] = true;
            System.out.println(this.getClass().getName() + " agora está interessada.");

            /* altera o valor de turn */
            RegiaoCritica.turn = process; //COMO ESTÁ NO LIVRO
            //RegiaoCritica.turn = other; //COMO ESTÁ NO EXEMPLO DA INTERNET

            /* comando nulo */
            while (RegiaoCritica.turn == process && RegiaoCritica.interested[other] == true); //COMO ESTÁ NO LIVRO
            //while (RegiaoCritica.interested[other] && RegiaoCritica.turn == other);//COMO ESTÁ NO EXEMPLO DA INTERNET

            // Tratamento de exceção em caso de erro.
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void leave_region(int process) { /* processo: quem está saindo */
        /* indica a saída da região crítica */
        RegiaoCritica.interested[process] = false;
        System.out.println(this.getClass().getName() + " saiu da região crítica.");
    }
}
